package com.tecode.myBooks.user.service.impl;

import com.tecode.myBooks.user.bean.User;
import com.tecode.myBooks.user.dao.UserDao;
import com.tecode.myBooks.user.dao.impl.UserDaoImpl;
import com.tecode.myBooks.user.service.UserService;
import com.tecode.myBooks.util.ConfUtil;
import com.tecode.myBooks.util.DateUtil;
import net.sf.json.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;

public class UserServiceImpl implements UserService {

	private UserDao userDao = new UserDaoImpl();
	
	/**
	 * 进行登录的业务处理方法
	 */
	@Override
	public User login(User u) {
		//1.调用Dao层查询该账户是否存在。
		
		User queryUser = userDao.getUserByAccount(u.getAccount());
/*
		if(queryUser == null){
			return null;
		}else if(!(queryUser.getPwd().equals(u.getPwd()))){
			return nu;
		}*/
		
		
		return queryUser;
	}

	/**
	 * 手机验证码发送业务方法
	 * @param phone
	 * @return
	 */
	@Override
	public String smsSend(String phone) {
		// accountSid=a14f6bfd43ce44c9b019de57f4e2de4b&smsContent=【秒嘀科技】您的验证码是345678，30分钟输入有效。
  //  &to=13896543210&timestamp=20150821100312&sig=a14f6bfd43ue44c9b019du57f4e2ee4r&respDataType=JSON

		//1.定义发送的验证码   6位的随机数
		int code = (int)(Math.random() * (999999-100000+1)) + 100000;


		//2.封装短信内容
		String smsContent ="【码教授】您的验证码为"+code+"，请于10分钟内正确输入，如非本人操作，请忽略此短信。";
		System.out.println(smsContent);
		//3.时间戳
		String timestamp = DateUtil.DateToString(new Date(),"yyyyMMddHHmmss");

		//4.生成秒滴的签名
		String sig=sign(timestamp);

		//5.设置返回类型
		String respDataType="JSON";

		//6.封装请求参数
		String param =getParam(smsContent,phone,timestamp,sig,respDataType);

		//7调用秒滴的短信接口
		try {
			String result ="{\"respCode\":\"00000\",\"respDesc\":\"请求成功。\",\"failCount\":\"0\",\"failList\":[],\"smsId\":\"3d07fbf033a64b89bb51f2f411e11159\"}";
			//System.out.println(send(param));
			result =send(param);
			//1.把字符串转换为JSON的对象
			JSONObject json = JSONObject.fromObject(result);
			//从返回的信息中获得状态码
			String resultCode = json.get("respCode").toString();

			//判断返回的状态码是否为成功的状态码
			if(resultCode.equals("00000")){
				//进入if表示发送成功。
				//把发送成功的验证码存入数据库中。
				if(changePhoneCode(phone,code)){
					return "短信发送成功";
				}
				return "短信发送失败。。";
			}

			return "短信发送失败。。";

		} catch (Exception e) {
			e.printStackTrace();
			return "短信发送失败。。";
		}

	}

	/**
	 * 修改手机登录验证码
	 * @param phone
	 * @param code
	 * @return
	 */
	@Override
	public boolean changePhoneCode(String phone, Integer code) {
		return userDao.userChange(code,phone) >0 ?true:false;
	}

	@Override
	public String phoneLogin(User user) {
		User u = userDao.phoneLogin(user.getPhone());
		if(u == null){
			return  "账号不存在";
		}else if(!(u.getVeriCode().equals(user.getVeriCode()))){
			return  "验证码错误";
		}else if (new Date().getTime() > u.getDeadline().getTime()){
			return  "验证码过期";
		}

		//使当前的验证码无效。
		changePhoneCode(user.getPhone(),0);
		return "登录成功";
	}


	public static void main(String[] args) {
			UserServiceImpl u = new UserServiceImpl();
			u.smsSend("12333");

	}

	/**
	 * 签名方法  进行了MD5加密
	 * @param timestamp
	 * @return
	 */
	public String sign(String timestamp){
		String ACCOUNT_SID = ConfUtil.ACCOUNT_SID;
		String AUTH_TOKEN = ConfUtil.AUTH_TOKEN;

		//签名，使用ACCOUNT_SID，AUTH_TOKEN，timestamp 进行MD5加密，获得签名。
		return DigestUtils.md5Hex(ACCOUNT_SID + AUTH_TOKEN + timestamp);
	}

	/**
	 * 封装调用秒滴短信接口需要的参数
	 * @param smsContent
	 * @param phone
	 * @param timestamp
	 * @param sig
	 * @param respDataType
	 * @return
	 */
	public String getParam(String smsContent,String phone,String timestamp,String sig,String respDataType){
		StringBuffer sb = new StringBuffer();
				sb.append("accountSid=")
				.append(ConfUtil.ACCOUNT_SID)
				.append("&smsContent=")
				.append(smsContent)
				.append("&to=").append(phone)
				.append("&timestamp=")
				.append(timestamp)
				.append("&sig=")
				.append(sig)
				.append("&respDataType=")
				.append(respDataType);


		return sb.toString();
	}


	/**
	 * 真正的短信发送方法
	 * @param param
	 * @return
	 */
	public String send(String param) throws Exception {
		//1.定义一个URL请求的对象
		URL url = new URL(ConfUtil.SMS_URL);

		//2.打开连接
		URLConnection conn = url.openConnection();

		//3.连接的参数设置
		conn.setConnectTimeout(2000);  //超时时间
		conn.setDoInput(true);//表示是否允许向流中邪数据
		conn.setDoOutput(true);//表示是否可以获得输出的信息

		//conn.

		//3.从连接中获得输出流
		OutputStream os =conn.getOutputStream(); //字节流
		//字符流
		// 字节转换为字符流
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));

		//把参数发送给秒滴
		bw.write(param);
		//刷新流
		bw.flush();


		//获得秒滴的返回结果
		InputStream is = conn.getInputStream();

		//把节点流转换为字符流
		BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));

		StringBuffer sb = new StringBuffer();
		String line="";
		while((line = br.readLine()) != null){
			sb.append(line);
		}

		br.close();
		is.close();
		os.close();
		bw.close();

		return  sb.toString();
	}
}
